// #include<iostream>
// class Test
// {
// public:
//     int operator()(int a ,int b )
//     {
//         return a * b;
//     }
// };

// class Cat 
// {
//     public:
//         Cat(std::string name);
//         Cat() = default;
//         ~Cat();
//     private:
//         std::string name{"Mimi"};
// };
// int main()
// {
//     Test test;
//     std:: cout << "10 * 20 = " << test(10,20)<< std ::endl;

//     auto test_ = [](int a, int b){ return a * b; };
//     std::cout << "10 * 20 = " << test_(10, 20) << std::endl;
//     // int a = 1;
//     // const int &b = a;
//     // //b = 10;//b的类型为const int
//     // auto c = b; //推导出c.type() = int
//     // int i = 1;
//     // int &j = i;
//     // auto k = j;
//     // const int *const a = 1;
//     int a = 1;
//     const int *const b = &a;
    
//     return 0;
// }

#include<iostream>
#include<memory>
class Person
{
    public:
        Person(std::string name) : m_name(name){};
        void show()
        {
            std::cout << m_name << std::endl;
        }

    private : 
        std::string m_name;
};
void show(std::unique_ptr<int> &u_pi)
{
    std::cout << *u_pi << std::endl;
}
void show_s(std::shared_ptr<int> s_pi)
{
    std::cout << *s_pi << std::endl;
}
void test()
{
    std::unique_ptr<int> u_pi{new int(10)};
    show(u_pi);
}
std::unique_ptr<Person> get_unique(std::string str)
{
    std::unique_ptr<Person> u_pi{new Person(str)};

    return u_pi;
}
void test01()
{
    get_unique("hua")->show();
}
void get_use(std::shared_ptr<int> s_pi)
{
    std::cout << s_pi.use_count() << std::endl;
}
void test02()
{
    std::shared_ptr<int> s_pi{new int(10)};
    std::cout << s_pi.use_count() << std::endl;
    get_use(s_pi);
    std::cout << s_pi.use_count() << std::endl;
}
int main()
{

    // std::unique_ptr<Person> u_P1{new Person("hihi")};
    // (*u_P1).show();
    // u_P1->show();
    //test02();
    std::shared_ptr<int> s_pi{new int(10)};
    std::unique_ptr<int> u_pi{new int(10)};
    show_s(u_pi);
    //使用多个指针管理同一个区域
    // int *pi;
    // int i = 10;
    // pi = &i;
    // int* pi2;
    // pi2 = new int(10);
    // //pi2 = &i;
    // std::cout << pi << std::endl;
    // std::cout << pi2 << std::endl;
    // std::unique_ptr<int> u_pi1{pi2};
    // //std::unique_ptr<int> u_pi2{pi2};
    // //delete pi2;
    // *pi2 = 20;

    // // pi2 = nullptr;
    // std::cout << *u_pi1 << std::endl;
    // //std::cout << &u_pi2 << std::endl;
    // int *external_pi_1;
    // int *external_pi_2;
    // {
    //     int *pi = new int(10);
    //     external_pi_1 = pi;
    //     std::unique_ptr<int> u_pi{new int(10)};
    //     auto it = u_pi.get();
    //     external_pi_2 = it;
    //     std::cout << *external_pi_1 << std::endl;
    //     std::cout << *external_pi_2 << std::endl;
    // }
    // std::cout << *external_pi_1 << std::endl;
    // std::cout << *external_pi_2 << std::endl;
    //不能copy 只能move
    // std::unique_ptr<int> u_pi = std::make_unique<int>(10);//通过默认构造函数创建
    // std::cout << *u_pi << std::endl;
    // //std::unique_ptr<int> u_pi2 = u_pi;//不可以直接copy
    // std::cout << &u_pi << std::endl;
    // std::unique_ptr<int> u_pi2 = std::move(u_pi);
    // std::cout << &u_pi << std::endl;
    // std::cout << *u_pi2 << std::endl;

    return 0;
}